Pokazanie tabeli, której obiekt posiada relację z wyświetlaną tabelą
Przykłąd w demo, mamy 2 tabele Album i Track. Track posiada pole parent, które jest typu PtigForeignKey i wskazuje na Album. Każdy Album może mieć wiele Tracks. Przykładowo wyświetlając wiersz tabeli Album, możemy w template użyć konstrukcji
[% id_extra] [row_actions] W tym momencie w pierwszej kolumnie tabeli z Albumami znajdzie się przycisk pozwalający otworzyć tabelę z listą Tracks przypisanych do Albumu. Dowiązanie odbywa się za pomocą pola field_list. Po / występuje track_set - jest to konstrukcja Django pozwalająca na pobranie wszystkich powiązanych wierszy z tabeli Track. Po przecinku wpisujemy tytuł pola.
Jeżeli wiążemy 2 tabele ale nie za pomocą mechanizmów udostępnionych przez Django (ForeignKey, ManyToManyField itp) musimy skorzystać z innego mechanizmu. Połączenia dokonujemy przez metodę filter modelu tabeli powiązanej z obecnie wyświetlaną. W bieżącej tabeli definioujemy pole typu row_related_list, pierwszym parametrem jest nazwa powiązanej tabeli poprzedzona nazwą aplikacji: application_name/table_name np: schattachements/Attachement. Kluczowy jest parametr filter. Powinien on on zawierać informacje, które pozwolą na wyfiltrowanie danych w tabeli powiązanej. Jeżeli powiązanie odbywa się po numerze wiersza, możesz wykonać powiązanie za pomocą object.id. Filtrowanie danych w tabeli podrzędnej odbywa się przy pomocy metody filter w modelu tabeli. Do pola value tej metody wpadnie wartość parametru filter dla pola row_related_list.
Przykładowe pole w template bierzącej tabeli:
Pzykładowa deklaracja w polu modelu tabeli powiązanej @classmethod def filter(cls, value): if value: app, tbl, id, grp = value.split("__") return cls.objects.filter( application=app, table=tbl, parent_id=id, group=grp ) else: return cls.objects.all()
Czasami potrzebujemy funkcjonalności, pozwalającej na zawężenie listy wyboru dostępnych opcji w polu formularza na podstawie wcześniej wykonanych wyborów.
Możemy w tym celu użyć konstrukcji comboselect. W aplikacji demo jest przykład pokazujący działanie całego mechanizmu. Oto przykładowy fragment templete, wyświetlającej formularz:
[inline_form] Pierwsze pole comboselect ma statyczną ilość opcji, zdefiniowanych za pomocą taga option. Trochę tak jak w html select. Drugie pole posiada parametr src. W gdy zmieniamy zawartość pierwszego pola (o nazwie x1), drugie pole o nazwie x2, pobiera listę opcji z serwera, przekazując w parametrze q wartość pola x1. Wiązanie odbywa się za pomocą wpisu x1, wyrażenie w podwójnych nawiasach kwadratowych przetwarzane jest w javascript w wyniku zmiany wartości pola x1. Url przekazywany przez parametr src musi zwrócić tekst html, który wypełni wnętrze elementu comboselect - powinien więc zawierać listę tagów typu option. Kolejne pole zo nazwie x3 zawiera podobną do x2 deklarację ale zapisaną w sposób bardziej bezpośredni. Znika magia, całą konstrukcję musisz zapisać w html. Ostatnie 4 pole różni się od drugiego sposobem przekazania nazwy pola, w tym przypadku zamiast nazwy odwołujemy się do pola formularza. Nazwa i label pobrane są z formularza, zawartość pola musimy jednak uzupełnić sami za pomocą tagów option.